package com.Ling.Thread.procuctorAndCustomer;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * File Name: prosuctPool
 * Date: 2020-06-28 11:06
 * Author: liangling
 * Description 产品池
 */
public class prosuctPool {
    //存储所有产品的集合，生产者生产产品，往这个集合中添加元素；消费者消费产品，从这个集合中取出元素
    private List<product> productList = new ArrayList<>();

    //产品池中产品的最大数量
    private int maxSize = 10;

    public prosuctPool() {
        //对产品池进行实例化
        this.productList = new LinkedList<>();
        //限定产品最大数量
        this.maxSize  = maxSize;

    }

    public prosuctPool(int maxSize) {
        this.maxSize = maxSize;
    }

    /**
     *
     * @param product
     */
    public synchronized void push(product product){
        //判断是否还需要再生产产品
        if (this.productList.size() == maxSize){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //生产者将生产的商品放入商品池
        //将产品添加到集合中
        this.productList.add(product);
        //通知其他人有产品可以消费了
        this.notifyAll();


    }

    /**
     * 消费者从商品池中取商品进行消费
     * @return
     */
    public synchronized product pop()  {
        //判断是否还有商品去消费
        if (this.productList.size()==0){
            try {
                this.wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }


        }
        //从商品池中秋取出商品
        product product = this.productList.remove(0);
        //通知其他人我取出一件商品
        this.notifyAll();

        return product;
    }
}
